//初始化菜单目录树
$(document).ready(function(){

	//初始化用户信息
	initUserInfo();
    //初始化菜单树
    initMenu();
    //初始化表单验证
    initMenuFormValid();
    //初始化功能验证
	initModuleDataFormValid();
	
	//保存整个菜单目录
	$("#btnSaveMenu").click(function(){
		var treeObj = $.fn.zTree.getZTreeObj("treeMenu");
		var node = treeObj.getNodes();
		//console.log(JSON.stringify(node[0].children));
		//批量保存菜单
		batchSaveMenu(node[0].children);
	});
	
	//刷新整个菜单目录
	$("#btnRefreshMenu").click(function(){
		//初始化菜单树
	    initMenu();
	    $(".right").hide();
	});
	
	//保存单个菜单目录
	$("#btnSaveMenuNode").click(function(){
		//添加菜单
		addMenu();
	});
	
	//关闭单个菜单目录
	$("#btnCloseMenuNode").click(function(){
		$(".right").hide();
	});
	
	//展开整个目录
	$("#btnDownMenu").click(function(){
		//全部展开
		var treeObj = $.fn.zTree.getZTreeObj("treeMenu");
		treeObj.expandAll(true);
	});
	
	//关闭整个目录
	$("#btnUpMenu").click(function(){
		//全部关闭
		var treeObj = $.fn.zTree.getZTreeObj("treeMenu");
		treeObj.expandAll(false);
	});
	
	 //保存按钮点击事件
    $("#btnModuleDataSave").click(function(){
    	saveModuleData();//保存数据
    });
	
    //初始化table，并显示功能数据
    $('#tbModelData').bootstrapTable(init);
});

var setting = {
	view: {
		addHoverDom: addHoverDom,
		removeHoverDom: removeHoverDom,
		selectedMulti: false
	},
	edit: {
		enable: true,
		editNameSelectAll: true,
		showRemoveBtn: showRemoveBtn,
		showRenameBtn: false
	},
	data: {
		key: {
			name: "menuName"
		},
		simpleData: {
			enable: true,
			idKey: "menuId",
			pIdKey: "parentMenuId",
		}
	},
	callback: {
		beforeClick: beforeClick,//点击菜单
		beforeDrag: beforeDrag,//菜单拖拽
		//beforeEditName: beforeEditName,//编辑菜单
		beforeRemove: beforeRemove
	}
};


//显示移除按钮
function showRemoveBtn(treeId, treeNode) {
	//顶层根目录不允许删除
	if(treeNode.menuId == 0){
		return false;
	}
	//含有子节点的不允许删除
	if(treeNode.children){
		return false;
	}
	return true;
}

//节点点击事件
function beforeClick(treeId, treeNode){
	if(treeNode.menuId == 0){
		return;
	}
	//重置验证
	initMenuFormValid().resetForm();
	$("#menuForm").find(".has-error").removeClass("has-error");
	//重置表单数据
	$("#menuForm").get(0).reset();
	$("#menuForm").find("#menuName").val(treeNode.menuName);
	$("#menuForm").find("#parentMenuId").val(treeNode.parentMenuId);
	//判断菜单属性是否存在
	if(treeNode.hasOwnProperty("menuPath")){//路径
		$("#menuForm").find("#menuPath").val(treeNode.menuPath);
		$("#menuForm").find("#menuId").val(treeNode.menuId);
		//操作标识：1，表示添加、2表示修改
		$("#menuForm").find("#type").val("2");
	}else{
		//操作标识：1，表示添加、2表示修改
		$("#menuForm").find("#type").val("1");
	}
	if(treeNode.hasOwnProperty("menuType")){//类型
		$("#menuForm").find("#menuType").val(treeNode.menuType);
	}
	if(treeNode.hasOwnProperty("status")){//状态
		$("#menuForm").find("#status").val(treeNode.status);
	}
	if(treeNode.hasOwnProperty("remark")){//备注
		$("#menuForm").find("#remark").val(treeNode.remark);
	}
	if(treeNode.hasOwnProperty("extendField1")){// 扩展字段1
		$("#menuForm").find("#extendField1").val(treeNode.extendField1);
	}
	$(".right").show();//显示菜单详细信息
	//判断是否刷新功能
	if($("#menuForm").find("#type").val() == "2"){
		$("#divModule").show();
		//初始化table，并显示功能数据
		$("#tbModelData").bootstrapTable('refresh', init);
	}else{
		$("#divModule").hide();
	}
	$("#"+treeNode.tId+"_remove").addClass("power-a");
	$("#"+treeNode.tId+"_remove").attr("power","MenuDelete");
	//设置功能元素
    setModule(JSON.parse(CommonUtils.getTempData("module")),"power-a");
}

//判断节点是否可以拖拽
function beforeDrag(treeId, treeNodes) {
	if(treeNodes[0].menuId == 0){
		return false;
	}
	return true;
}

//删除节点
function beforeRemove(treeId, treeNode) {
	//删除数据模式窗口
	swal({
		title : "您确定要删除这些信息吗",
		text : "删除后将无法恢复，请谨慎操作！",
		type : "warning",
		showCancelButton : true,
		confirmButtonColor : "#DD6B55",
		confirmButtonText : "删除",
		closeOnConfirm : false
	}, function() {
	    $.ajax({url:'/init/menu/deleteMenu',
	    	data:CommonUtils.encapsulationData({menuId:treeNode.menuId}),
	    	type:'post', 
	    	async:false,//同步请求
	    	dataType:'json',  
	    	contentType: "application/json",
	    	success:function(data) {  
	    		if(data.result){
	    			//消息提示款
					swal({title : "恭喜您",text : data.msg,type : "success"},function(){
						//初始化菜单树
					    initMenu();
					    $(".right").hide();//显示菜单详细信息
					});
	    		}
	    	},
	    	error : function(req, status, err) { 
	    		//消息提示款
				errorFunc(req, status, err);
	    	}  
	    });
	});
	return false;
}

//鼠标移上节点显示添加、删除节点按钮
var newCount = 1;
function addHoverDom(treeId, treeNode) {
	var sObj = $("#" + treeNode.tId + "_span");
	if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0) return;
	var addStr = "<span class='button add power-a' power='MenuAdd' id='addBtn_" + treeNode.tId + "' title='新增栏目' onfocus='this.blur();'></span>";
	sObj.after(addStr);
	var btn = $("#addBtn_"+treeNode.tId);
	if (btn) btn.bind("click", function(){
		var zTree = $.fn.zTree.getZTreeObj("treeMenu");
		zTree.addNodes(treeNode, {menuId:(100 + newCount), parentMenuId:treeNode.menuId, menuName:"new node" + (newCount++)});
		return false;
	});
	sObj.parent().find(".remove").addClass("power-a");
	sObj.parent().find(".remove").attr("power","MenuDelete");
	//设置功能元素
    setModule(JSON.parse(CommonUtils.getTempData("module")),"power-a");
};

//鼠标移除节点隐藏添加、删除节点按钮
function removeHoverDom(treeId, treeNode) {
	$("#addBtn_"+treeNode.tId).unbind().remove();
};

//查询菜单集合
var findMenuList = function(){
	//菜单节点
	var zNodes = new Array();
	//请求后台
	$.ajax({url:"/init/menu/findMenuList",
		data:CommonUtils.encapsulationData({}),
    	type:'post', 
    	async:false,//同步请求
    	dataType:'json',  
    	contentType: "application/json",
    	success:function(data) {  
    		if(null != data && data.length > 0){
    			zNodes = data;
    		}
    	},
    	error : function(req, status, err) { 
    		//消息提示款
			errorFunc(req, status, err);
    	}  
    });
	return zNodes;
}


//添加菜单
var addMenu = function(){
	//验证表单数据
	if (!$("#menuForm").valid()) {
		return;
    }
	//获取表单元素所有数据集合
	var formData = CommonUtils.getFormJson('#menuForm');
	//操作标识：1，表示添加、2表示修改
	var type = $("#menuForm").find("#type").val(); 
	var url = null;
	if(type == "2"){//修改
		url = "/init/menu/updateMenu";
		//设置栏目Id
		formData.menuId = $("#menuForm").find("#menuId").val();
	}else{//添加
		url = "/init/menu/addMenu";
	}
	//设置父节点Id
	var parentMenuId = $("#menuForm").find("#parentMenuId").val();
	formData.parentMenuId = parentMenuId;
	//请求后台
	$.ajax({url:url,
		data:CommonUtils.encapsulationData(formData),
    	type:'post', 
    	dataType:'json',  
    	contentType: "application/json",
    	success:function(data) {  
    		if(data.result){
    			//消息提示款
				swal({title : "恭喜您",text : data.msg,type : "success"},function(){
					//初始化菜单树
				    initMenu();
				    $(".right").hide();
				});
    		}else{
    			//消息提示款
				swal({title : "很抱歉",text : data.msg,type : "error"});
    		}
    	},
    	error : function(req, status, err) { 
    		//消息提示款
			errorFunc(req, status, err);
    	}  
    });
}

//批量菜单集合
var batchSaveMenu = function(nodes){
	//请求后台
	$.ajax({url:"/init/menu/updateBatchMenu",
		data:CommonUtils.encapsulationData({nodes:nodes}),
    	type:'post', 
    	dataType:'json',  
    	contentType: "application/json",
    	success:function(data) {  
    		if(data.result){
    			//消息提示款
				swal({title : "恭喜您",text : data.msg,type : "success"},function(){
					//初始化菜单树
				    initMenu();
				});
    		}else{
    			//消息提示款
				swal({title : "很抱歉",text : data.msg,type : "error"});
    		}
    	},
    	error : function(req, status, err) { 
    		//消息提示款
			errorFunc(req, status, err);
    	}  
    });
}


//初始化菜单树
var initMenu = function(){
	//查询所有菜单目录并转换
	var nodes = findMenuList();
	//增加顶层根目录
	nodes.push({ menuId:0,parentMenuId:-1,menuName:"栏目菜单",open:true});
	//初始化栏目菜单
	$.fn.zTree.init($("#treeMenu"), setting, nodes);
	//全部展开
	var treeObj = $.fn.zTree.getZTreeObj("treeMenu");
	treeObj.expandAll(true);
}

//表单验证初始化
var initMenuFormValid = function(){
	var e = "<i class='fa fa-times-circle'></i> ";
	var validate = $("#menuForm").validate({
		rules : {
			menuName : {
				required : !0,
				maxlength : 25
			},
			menuPath : {
				required : !0,
				maxlength : 100,
			}
		},
		messages : {
			menuName : {
				required : e + "请填点名称",
				maxlength : e + "名称不能超过25字符"
			},
			menuPath : {
				required : e + "请填写路径",
				maxlength : e + "路径不能超过100字符",
			}
		},
		highlight : function(e) {
			if(e.type == "radio" || e.type == "checkbox"){
				$(e).parent().parent().removeClass("has-success").addClass("has-error");
			}else{
				$(e).parent().removeClass("has-success").addClass("has-error");
			}
		},
		success : function(e) {
			if(e.type == "radio" || e.type == "checkbox"){
				$(e).parent().parent().removeClass("has-error");//.addClass("has-success")
			}else{
				$(e).parent().removeClass("has-error");//.addClass("has-success")
			}
		},
		errorElement : "span",
		errorPlacement : function(e, r) {
			if(r.is(":radio") || r.is(":checkbox")){
				e.appendTo(r.parent().parent());
			}else{
				e.appendTo(r.parent());
			}
		},
		errorClass : "help-block m-b-none",
		validClass : "help-block m-b-none"
	});
	return validate;
}


/*******************************************功能管理******************************************************/
//查询的参数
var queryParams = function (params) {
	var menuId = $("#menuForm").find("#menuId").val();
    var temp = {   //这里的键的名字和控制器的变量名必须一直，这边改动，控制器也需要改成一样的
        limit: params.limit,   //页面大小
        offset: params.offset, //页码
        menuId: (null != menuId && "" != menuId) ? menuId : "-1"
    };
    return CommonUtils.encapsulationData(temp);
};

//操作
var actionFormatter = function(value, row, index) {
    var result = "";
    result += "<a power='ModuleUpdate' href='javascript:;' class='btn btn-xs blue power-a' onclick=\"showModule(2,'" + value + "')\" title='编辑'><span class='glyphicon glyphicon-pencil'></span></a>";
    result += "<a power='ModuleDelete' href='javascript:;' class='btn btn-xs red power-a' onclick=\"deleteModuleData('" + value + "')\" title='删除'><span class='glyphicon glyphicon-remove'></span></a>";
    result += "<a power='ModuleDetails' href='javascript:;' class='btn btn-xs green power-a' onclick=\"showModule(3,'" + value + "')\" title='查看'><span class='glyphicon glyphicon-search'></span></a>";
    return result;
}

//状态字段渲染
var statusFormatter = function(value) {
	var name = "";
    if (value == "1") { 
    	name = "<span style='color:rgb(33, 185, 187);font-weight: bold;' class='fa fa-circle'>启用</span>";
    }else { 
    	name = "<span style='color:rgb(237, 85, 101);font-weight: bold;' class='fa fa-circle'>禁用</span>";
    }
    return name;
}

//时间格式化
var dataFormatter = function(value){
	if(null != value && "" != value){
		return value.replace(".0","");
	}
	return "";
}

//bootstrapTable初始化参数
var init = {
    url: '/init/menu/findModules', //请求后台的URL（*）
    method: 'post',                      //请求方式（*）
    toolbar: '#toolbar',                //工具按钮用哪个容器
    striped: true,                      //是否显示行间隔色
    cache: false,                       //是否使用缓存，默认为true，所以一般情况下需要设置一下这个属性（*）
    pagination: true,                   //是否显示分页（*）
    sortable: true,                     //是否启用排序
    sortOrder: "asc",                   //排序方式
    queryParams: queryParams,           //传递参数（*）
    sidePagination: "server",           //分页方式：client客户端分页，server服务端分页（*）
    pageNumber:1,                       //初始化加载第一页，默认第一页
    pageSize: 5,                       //每页的记录行数（*）
    pageList: [10, 25, 50, 100],        //可供选择的每页的行数（*）
    search: false,                       //是否显示表格搜索，此搜索是客户端搜索，不会进服务端，所以，个人感觉意义不大
    strictSearch: true,
    showColumns: false,                  //是否显示所有的列
    showRefresh: false,                  //是否显示刷新按钮
    minimumCountColumns: 2,             //最少允许的列数
    clickToSelect: false,                //是否启用点击选中行
    //height: 500,                        //行高，如果没有设置height属性，表格自动根据记录条数觉得表格高度
    uniqueId: "moduleId",                 //每一行的唯一标识，一般为主键列
    showToggle:false,                    //是否显示详细视图和列表视图的切换按钮
    cardView: false,                    //是否显示详细视图
    detailView: false,                   //是否显示父子表
	columns: [ {
			 field:'moduleId',
			 title: '操作&nbsp;<button type="button" id="btnUpMenu" title="增加" onclick=showModule(1,"") class="btn btn-outline btn-default btn-sm"><span class="glyphicon glyphicon glyphicon-plus" aria-hidden="true"></span></button>',
             width: 100,
             align: 'center',
             valign: 'middle',
             formatter: actionFormatter
		}, {
			field: 'moduleName',
			title: '功能名称'
		},{
			field: 'moduleCode',
			title: '功能编码',
			sortable : true
		},{
			field: 'remark',
			title: '备注',
			sortable : true,
			visible: false
		}, {
			field: 'createByName',
			title: '创建人',
			visible: false
		}, {
			field: 'createDate',
			title: '创建时间',
			formatter: dataFormatter,
			visible: false
		}, {
			field: 'lastUpdateByName',
			title: '最后更新人',
			visible: false
		}, {
			field: 'lastUpdateDate',
			title: '最后更新时间',
			formatter: dataFormatter,
			visible: false
		}
	],
	onLoadSuccess:function(data){
		initLoadSuccess(data);
	},
	onExpandRow:function (index,row,$detail) {  
	    initSubTable(index,row,$detail);  
	},
	onLoadError:function(status, res){
		errorFunc(res,status);
	}
}


//判断弹出框类型（修改、新增、详情）并显示
var showModule =function(type,moduleId){
	//重置表单
	$("#dataModuleForm").get(0).reset();
	//弹出模式窗口
	$('#dataModule').modal({show:true,backdrop: 'static', keyboard: false});  
	//添加
	if(type == 1){
		$('#dataModule').find("h4").html("添加功能");
		//显示区域
		$('#dataModule').find("#edit").show();
		$('#dataModule').find("#detail").hide();
		//保存按钮显示
		$('#dataModule').find("#btnModuleDataSave").show();
		//重置验证
		initModuleDataFormValid().resetForm();
		$("#dataModuleForm").find(".has-error").removeClass("has-error");
	}
	//修改
	if(type == 2){
		$('#dataModule').find("h4").html("修改功能");
		//显示区域
		$('#dataModule').find("#edit").show();
		$('#dataModule').find("#detail").hide();
		//保存按钮显示
		$('#dataModule').find("#btnModuleDataSave").show();
		//重置验证
		initModuleDataFormValid().resetForm();
		$("#dataModuleForm").find(".has-error").removeClass("has-error");
		//查询基础数据详细信息
		var moduleDataInfo = findModuleDataInfo(moduleId);
		//填充表单数据
		CommonUtils.fillFormData("#dataModuleForm",JSON.stringify(moduleDataInfo));
		//填充隐藏moduleId
		$("#dataModuleForm").find("#moduleId").val(moduleId);
	}
	//详情
	if(type == 3){
		$('#dataModule').find("h4").html("功能详情");
		//查询基础数据详细信息
		var moduleDataInfo = findModuleDataInfo(moduleId);
		//填充表单数据
		CommonUtils.fillFormData("#detail",JSON.stringify(moduleDataInfo));
		//状态
		$("#detail").find("#status").html(statusFormatter(moduleDataInfo.status));
		//显示区域
		$('#dataModule').find("#edit").hide();
		$('#dataModule').find("#detail").show();
		//保存按钮隐藏
		$('#dataModule').find("#btnModuleDataSave").hide();
	}
	//隐藏值，基础数据判断提交数据的类型
	$('#dataModule').find("#modalType").val(type);
}

//保存基础数据
var saveModuleData=function(){
	//验证表单数据
	if (!$("#dataModuleForm").valid()) {
		return;
    }
	//获取表单元素所有数据集合
	var formData = CommonUtils.getFormJson('#dataModuleForm');
	//添加或编辑类型变量
	var type = $('#dataModule').find("#modalType").val();
	var url = null;
	if(type == "1"){//添加
		url = "/init/menu/addModule";
		formData.menuId = $("#menuForm").find("#menuId").val();
	}else{//修改
		url = "/init/menu/updateModule";
		formData.moduleId = $("#dataModuleForm").find("#moduleId").val();
	}
	//请求后台
	$.ajax({
		url:url,
		data:CommonUtils.encapsulationData(formData),
		type:'post',  
		dataType:'json',  
		contentType: "application/json",
		success:function(data) {
			if(data.result){
				//消息提示款
				swal({title : "恭喜您",text : data.msg,type : "success"},function(){
					//关闭弹出框
					$("#dataModule").modal("hide");
					//刷新主列表
					$("#tbModelData").bootstrapTable('refresh', init);
			    	//重置表单
					$("#dataModuleForm").get(0).reset();
				});
	   		}else{
	   			//消息提示款
				swal({title : "很抱歉",text : data.msg,type : "error"});
	   		}
		},
		error : function(req, status, err) {  
			//消息提示款
			errorFunc(req, status, err);
		}  
	});
};

//删除基础数据
var deleteModuleData =function(moduleId){
	//删除数据模式窗口
	swal({
		title : "您确定要删除这些信息吗",
		text : "删除后将无法恢复，请谨慎操作！",
		type : "warning",
		showCancelButton : true,
		confirmButtonColor : "#DD6B55",
		confirmButtonText : "删除",
		closeOnConfirm : false
	}, function() {
	    $.ajax({url:'/init/menu/deleteModule',
	    	data:CommonUtils.encapsulationData({moduleId:moduleId}),
	    	type:'post', 
	    	async:false,//同步请求
	    	dataType:'json',  
	    	contentType: "application/json",
	    	success:function(data) {  
	    		if(data.result){
	    			//消息提示款
					swal({title : "恭喜您",text : data.msg,type : "success"},function(){
						//刷新主列表
						$("#tbModelData").bootstrapTable('refresh', init);
					});
	    		}else{
		   			//消息提示款
					swal({title : "很抱歉",text : data.msg,type : "error"});
		   		}
	    	},
	    	error : function(req, status, err) { 
	    		//消息提示款
				errorFunc(req, status, err);
	    	}  
	    });
	})
}

//查询基础数据详细信息
var findModuleDataInfo=function(moduleId) {
	var moduleDataInfo = null;
	$.ajax({url:'/init/menu/findModule',
		data:CommonUtils.encapsulationData({moduleId:moduleId}),
		type:'post',  
		dataType:'json',
		async:false,//同步请求
		contentType: "application/json",
		success:function(data) {  
			if(null != data){
				moduleDataInfo = data;
			}
		},
		error : function(req, status, err) { 
			//消息提示款
			errorFunc(req, status, err);
		}  
	});
	return moduleDataInfo;
}

//增加自定义验证
jQuery.validator.addMethod("moduleCode", function(value, element) {
    var length = value.length;
    var moduleCode = /^[a-zA-Z_0-9]+$/;//数字、字母、下划线
    return this.optional(element) ||  moduleCode.test(value);
}, "请输入正确的础数据编码");


//表单验证初始化
var initModuleDataFormValid = function(){
	var e = "<i class='fa fa-times-circle'></i> ";
	var validate = $("#dataModuleForm").validate({
		rules : {
			moduleName :{
				required:true,
				maxlength:20
			},
			moduleCode: {
				required:true,
				moduleCode:true,
				maxlength:50
			}
		},
		messages : {
			moduleName : {
				required:e + "请输入基础数据名称",
				maxlength:e + "输入的基础数据名称长度不能超过20个字符"
			},
			moduleCode :{
				required:e + "请输入基础数据编码",
				moduleCode:e + "请输入正确的础数据编码（字母、数字或下划线）",
				maxlength:e + "输入的基础数据编码长度不能超过50个字符"
			} 
		},
		highlight : function(e) {
			if(e.type == "radio" || e.type == "checkbox"){
				$(e).parent().parent().parent().removeClass("has-success").addClass("has-error");
			}else{
				$(e).parent().parent().removeClass("has-success").addClass("has-error");
			}
		},
		success : function(e) {
			if(e.type == "radio" || e.type == "checkbox"){
				$(e).parent().parent().parent().removeClass("has-error");//.addClass("has-success")
			}else{
				$(e).parent().parent().removeClass("has-error");//.addClass("has-success")
			}
		},
		errorElement : "span",
		errorPlacement : function(e, r) {
			if(r.is(":radio") || r.is(":checkbox")){
				e.appendTo(r.parent().parent());
			}else{
				e.appendTo(r.parent());
			}
		},
		errorClass : "help-block m-b-none",
		validClass : "help-block m-b-none"
	});
	return validate;
}

	
